home *** CD-ROM | disk | FTP | other *** search
- /*
- * inquire - SCSI inquire of SCSI bus devices
- * by Charles E. Chambers (chambers@uh.edu)
- * Mar 20, 1991
- */
- /*
- USE AT YOUR OUR RISK.
- I NOT NOT BE RESPONSIBLE FOR PROBLEM CAUSED BY THIS PROGRAM.
- */
-
- #include <fcntl.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <nextdev/scsireg.h>
-
- static char *dev_name="/dev/sg0"; /* generic scsi interface */
-
- int scsi_open(int target, int lun);
- void scsi_show_inquiry(int fd, int target, int lun);
- int gs_inquiry(int fd, int lun, int clen, u_char *data);
- int gs_request_sense(int fd, int lun);
-
- main(int argc, char *argv[])
- {
- extern int optind;
- extern char *optarg;
-
- char c;
-
- int fd;
- int target, target_start, target_end;
- int lun, lun_start, lun_end;
- int pagecode = -1;
- int controlfield = -1;
- target_start = 0;
- target_end = 7;
- lun_start = 0;
- lun_end = 7;
- while ((c = getopt(argc, argv, "t:l:")) != EOF) {
- switch (c) {
- case 't':
- target_start = atoi(optarg);
- target_end = target_start;
- break;
- case 'l':
- lun_start = atoi(optarg);
- lun_end = lun_start;
- break;
- default:
- fprintf(stderr,
- "usage: %s [-t<target>] [-l<lun>]\n",
- argv[0]);
- exit(1);
- }
- }
- for (target = target_start; target <= target_end; target++)
- for (lun = lun_start; lun <= lun_end; lun++) {
- if ((fd = scsi_open(target, lun)) >= 0) {
- scsi_show_inquiry(fd, target, lun);
- close(fd);
- }
- }
- }
-
- int scsi_open(int target, int lun)
- {
- struct scsi_adr sa;
- int fd;
-
- if ((fd = open(dev_name, O_RDWR)) < 0) {
- fprintf(stderr,"\nCould not open %s\n",dev_name);
- return(-1);
- }
-
- sa.sa_target = target;
- sa.sa_lun = lun;
- if (ioctl(fd,SGIOCSTL,&sa) < 0) {
- fprintf(stderr,"Error setting target %d lun %d\n",target,lun);
- close(fd);
- return(-1);
- }
-
- if(gs_request_sense(fd, lun)) { /* clear unit attention */
- close(fd);
- return(-1);
- }
- return(fd);
- }
-
- void scsi_show_inquiry(int fd, int target, int lun)
- {
- u_char data[64];
- int i;
-
- bzero(data, sizeof(data));
- if(gs_inquiry(fd, lun, sizeof(data), data)) {
- fputs("error in inquiry\n", stderr);
- close(fd);
- exit(1);
- }
- if (data[0] != 0x7f) {
- fprintf(stdout,"-t %d -l %d \"",target,lun);
- for (i=8;i<16;i++) fprintf(stdout,"%c",data[i]);
- fprintf(stdout,"/");
- for (i=16;i<32;i++) fprintf(stdout,"%c",data[i]);
- fprintf(stdout,"/");
- for (i=32;i<36;i++) fprintf(stdout,"%c",data[i]);
- fprintf(stdout,"/\" ");
- fprintf(stdout," typ=%d",data[0]);
- fprintf(stdout," dev=%d",data[1]&0x7f);
- fprintf(stdout," ans=%d",data[2]);
- fprintf(stdout," fmt=%d",data[3]&0xf);
- if ( (data[1]&0x80) != 0)
- fprintf(stdout," removable");
- fprintf(stdout,"\n");
- }
- }
-
- int gs_inquiry(int fd, int lun, int clen, u_char *data)
- {
- struct scsi_req sr;
- struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6;
-
- bzero((char *)&sr, sizeof(sr));
- cdbp->c6_opcode = C6OP_INQUIRY;
- cdbp->c6_lun = lun;
- cdbp->c6_lba = 0;
- cdbp->c6_len = clen;
- sr.sr_dma_dir = SR_DMA_RD;
- sr.sr_addr = (caddr_t)data;
- sr.sr_dma_max = clen;
- sr.sr_ioto = 10;
- return(do_ioc(fd, &sr));
- }
-
- int do_ioc(int fd, struct scsi_req *sr)
- {
- if (ioctl(fd, SGIOCREQ, sr) < 0) {
- perror("ioctl(SGIOCREQ)");
- return(-1);
- }
- if(sr->sr_io_status) {
- if(sr->sr_io_status == SR_IOST_CHKSV) {
- fprintf(stderr,
- "sense key = 0x%02X, sense code = 0x%02X\n",
- sr->sr_esense.er_sensekey,
- sr->sr_esense.er_addsensecode);
- }
- return(-1);
- }
- return(0);
- }
-
- int gs_request_sense(int fd, int lun)
- {
- struct scsi_req sr;
- struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6;
- u_char sbuf[128];
-
- bzero((char *)&sr, sizeof(sr));
- cdbp->c6_opcode = C6OP_REQSENSE;
- cdbp->c6_lun = lun;
- cdbp->c6_len = 18;
- sr.sr_dma_dir = SR_DMA_RD;
- sr.sr_addr = (caddr_t)sbuf;
- sr.sr_dma_max = 128;
- sr.sr_ioto = 10;
- return(do_ioc(fd, &sr));
- }
-